package com.qzh.TurnSimulator.entity;

import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
 * 城市类
 */
@Data
@Accessors(chain = true)
public class City {
    /*
    id
     */
    private int id;
    /*
     名字
     */
    private String name;
    /*
    描述，固定，不可修改
     */
    private  String description;
    /**
     * 位置信息X
     */
    private  int X;
    /**
     * 位置信息Y
     */
    private  int Y;
    private boolean active;
    /**
     * 简要化的一次性告知信息
     */
    private String notification;
    /**
     * 城市简要通知信息列表
     */
    private List<String> informationList;
    /**
     * 土地规模
     * 土地大小
     */
    private int landScale;
    /**
     * 距离首都的距离，
     * 影响部分效果
     * 如果有第二首都，则以哪个近为准
     */
    private int destinationAwayFromCapital;
    ///////////////以下为人口相关///////////////
    /**
     *城市总人口
     */
    private int population;
    /**
     * 出生率
     * 每回合人口将增加这些比例的人口，向下取整
     */
    private BigDecimal birthRate;
    /**
     * 总死亡率
     * 总死亡/总人口
     * 每回合人口将减少这些比例的人口，向下取整
     */
    private BigDecimal deathRate;
    /**
     * 当前城市的宗教活动的总人口
     */
    private int ReligionPopulation;
    ///////////////以下为经济相关///////////////
    /**
     * 总钱币，一直累计
     */
    private BigDecimal totalMoney = BigDecimal.ZERO;
    /**
     * 库存钱币
     */
    private BigDecimal storedMoney = BigDecimal.ZERO ;
    /**
     * 当前回合新增、减少的钱币
     */
    private BigDecimal currentMoney;
    /**
     * 经济腐败率，经济会减少这些数值money *（1-CorruptionRate）
     */
    private BigDecimal corruptionRate;
    /**
     * 农业产值
     */
    private BigDecimal agricultureProduction;
    /**
     *商业产值
     */
    private BigDecimal commerceProduction;
    /**
     * 工业产值
     */
    private BigDecimal industryProduction;
    /**
     * 服务业产值
     */
    private BigDecimal serviceProduction;
    /**
     * 农业产值，总计
     */
    private BigDecimal totalAgricultureProduction;
    /**
     *商业产值，总计
     */
    private BigDecimal totalCommerceProduction;
    /**
     * 工业产值，总计
     */
    private BigDecimal totalIndustryProduction;
    /**
     * 其他产值，总计
     */
    private BigDecimal totalServiceProduction;
    /**
     * 从事农业的人口
     */
    private int agriculturePopulation;
    /**
     * 从事工业的人口
     */
    private int industryPopulation;
    /**
     * 从事商业的人口
     */
    private int commercePopulation;
    /**
     * 从事商业的人口
     */
    private int servicePopulation;
    /**
     * 无法从事生产的人口
     */
    private int unproductivePopulation;
     //产值系数分为三个部分：技能系数skill,工具系数util,心情系数will
    //一般来说是产值 = 人口*技能系数*工具系数*心情系数
    private BigDecimal agricultureSkillIndex;
    private BigDecimal agricultureUtilIndex;
    private BigDecimal agricultureWillIndex;
    private BigDecimal industrySkillIndex;
    private BigDecimal industryUtilIndex;
    private BigDecimal industryWillIndex;
    private BigDecimal commerceSkillIndex;
    private BigDecimal commerceUtilIndex;
    private BigDecimal commerceWillIndex;
    private BigDecimal serviceSkillIndex;
    private BigDecimal serviceUtilIndex;
    private BigDecimal serviceWillIndex;

/*************************以下为方法***************************/
    /**
     * 增加人口，先增加到不能生产的人口
     * 再增加到总人口
     * @param added
     */
    public void addPopulation(BigDecimal added){
    this.unproductivePopulation += added.intValue();
    this.population += added.intValue();
}

    /**
     * 增加经济的方法，传进来的生产数值*（1-腐败率）
     *
     * @param bigDecimal             农业
     * @param bigDecimal1            商业
     * @param bigDecimal2            工业
     * @param addedServiceProduction 服务业
     */
    public void addMoney(BigDecimal bigDecimal, BigDecimal bigDecimal1, BigDecimal bigDecimal2, BigDecimal addedServiceProduction) {
        agricultureProduction = bigDecimal.multiply(BigDecimal.ONE.subtract(corruptionRate)).setScale(6, RoundingMode.HALF_DOWN);
        commerceProduction = bigDecimal1.multiply(BigDecimal.ONE.subtract(corruptionRate)).setScale(6, RoundingMode.HALF_DOWN);
        industryProduction = bigDecimal2.multiply(BigDecimal.ONE.subtract(corruptionRate)).setScale(6, RoundingMode.HALF_DOWN);
        serviceProduction =addedServiceProduction.multiply(BigDecimal.ONE.subtract(corruptionRate)).setScale(6, RoundingMode.HALF_DOWN);
        totalAgricultureProduction =  totalAgricultureProduction.add(agricultureProduction);
        totalCommerceProduction =  totalCommerceProduction.add(commerceProduction);
        totalIndustryProduction =  totalIndustryProduction.add(industryProduction);
        totalServiceProduction = totalServiceProduction.add(serviceProduction);
        currentMoney = agricultureProduction.add(commerceProduction).add(industryProduction).add(serviceProduction);
        totalMoney = totalMoney.add(currentMoney);



    }
}
